|
|
|
|
|
|
|
Windows内核调试
帖子发起人: zyq8709 发起时间: 2011-05-24 12:00 下午 回复: 5
|
帖子排序:
|
|
|
|
2011-05-24, 12:00 下午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
|
|
先请各位看一下附件文章中关于windows的irql的分析。
问1:缺页中断到底运行在哪一个中断级,是DISPATCH还是APC,还是低于DISPATCH的任意级上?注意不是发生的条件,而是发生缺页中断后,其中断过程运行中的中断级。因为我看源代码中并没有发生irql的提升,只是有一个关于当前irql与apc级的判断。
问2:磁盘i/o运行在哪一级上?根据文章所说其运行在dispach级,那么就有问题了。首先按其说法,是磁盘运行完需发出中断,然后中断在派出一个dpc,由于中断前的磁盘i/o驱动过程在dispach级,那么就算是发生dpc也不会响应。而且我感觉一般的文件操作调用的磁盘i/o首先会把数据读入系统空间,那就不必保持上下文不变了。但是对于页面异常,如果是用户空间发生了缺页,那么不保持Dispatch级,页面中断异常过程可能就与原来发生缺页的线程不在同一上下文,那么对于多变的用户空间,就会写错内存位置,这不是互相矛盾吗?
问3:如果页面异常过程或磁盘i/o运行在dispatch级,那根据深入解析windows所说,i/o过程要等待对象,那在dispatch级等待对象就会造成当前线程挂起而且也无法切换其他线程就会死锁崩溃。这一现象又如何解释?
小弟对于这几个问题急于得到解答,请各位高手给地提示,哪怕一星半点也好,在此多谢了!!!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-24, 21:51 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
Page Fault是CPU异常,与外部中断是有区别的(参见《软件调试》第3章,3.1.3)。从CPU的角度来讲,只要符合Page Fault的条件(比如页无效),就产生Page Fault,不管当时的IRQL,因为异常是不可禁止或屏蔽的。所以理论上,当PageFault的异常处理函数被调用时,当前的IRQL可能是任意值,但出于NT内存管理器的设计原则,要求IRQL低于DISPATCH_LEVEL,否则就视为违例,产生蓝屏。这个要求又进一步演变为当IRQL为DISPATCH_LEVEL或者更高时不能触发Page Fault,又常常表达为不能访问分页内存...
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-25, 08:06 上午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
|
|
多谢张老师的耐心解答!但是还有一点就是磁盘i/o究竟运行在哪一中断级别上?还有就是如果其低于dispatch级,那么它如何保证磁盘中断发生读取数据时的地址空间还是引发i/o的线程的地址空间呢?如果保证不了,那么当用户空间出现页面故障时,不就会发生将数据写入另一地址空间中了吗?
另:在比dispatch更高的中断级上,发生了进程调度中断,那么是不是将其作为伪中断忽略了,而不会引发崩溃?
请张老师继续关注,多谢了!我有些太较真,不好意思啦,呵呵。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-27, 09:22 上午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
DDK中会给出每个内核函数可以运行的IRQL,但这只是要求和期望,如上面的崩溃所示,当时就是在IRQL=2时调用文件I/O,此时文件I/O函数(ZwCreateFile)就是运行在IRQL=2上。所以较真的答案是不一定,都有可能,完全看调用的代码怎么写。
对与另字开始的问题,NT是以时钟中断触发来执行线程/进程调度的,时钟中断的IRQL是28,远远高于DISPATCH_LEVEL,所以只要中断没有被屏蔽,那么CPU还可以响应时钟中断,但是时钟中断处理好后,如果此前在某个线程的上下文中有IRQL违例,还是会继续处理,继续蓝屏,一旦进了蓝屏处理函数KeBugCheck2, KeBugCheck2很快就会关闭中断,拒绝打扰,"专心"蓝屏了...
论坛不是系统学习的地方,建议你找本书认真读下
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-27, 11:36 上午
|
zyq8709
注册: 2011-04-19
发 贴: 74
|
|
|
谢谢张老师!
其实我一直在看一些windows内核分析的书,如毛德操和潘爱民老师的,这些书很不错,但是我的一些疑问,在这些书中找不到答案,书中忽略掉了这些细节,上网搜索寻找却越来越糊涂,所以只好来论坛上求教了!
其实我的意思是磁盘i/o应该运行在什么Irql上是正常的。因为我考虑到用户空间发生页面故障时,产生磁盘i/o,如果正常运行,它是如何保持线程上下文不变,而使地址空间不变,从而使页面数据可以正确的读入内存呢?
还有就是高于DISPATCH_LEVEL如果要发生进程调度,导致时钟中断,但不会进而切换进程,我的疑问是它导致了时钟中断会不会引发崩溃,因为在高irql的中断服务例程中也会发生进程时间片用尽而产生时钟中断,但是到底会不会出错,如果会出错,那么是不是得在中断服务例程中关中断?
麻烦张老师再推荐一些学习windows内核的一些好书,多谢了!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2011-05-27, 22:38 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
建议读一下《Windows Internals》In-Paging I/O一节
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » Windows内核调试 » 越想越糊涂,求各位老师给予指点,多谢!
|
|
|
|
|
|